<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>[1.26]-数据安全：数据对称加密方案 | PhalApi(π框架) - PHP轻量级开源接口框架 - 助你创造价值！</title>
    <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
    <meta content="yes" name="apple-mobile-web-app-capable">
    <meta content="black" name="apple-mobile-web-app-status-bar-style">
    <meta content="telephone=no" name="format-detection">
    <meta content="email=no" name="format-detection">
    <meta name="Author" content="PhalApi,ecitlm,dogstar">
    <meta name="description" content="[1.26]-数据安全：数据对称加密方案，PhalApi是一个PHP轻量级开源接口框架，致力于快速开发接口服务。支持HTTP/SOAP/RPC等协议，可用于搭建接口/微服务/RESTful接口/Web Services。我们不断更新，保持生气；为接口负责，为开源负责！并承诺永久免费！">
    <meta name="keywords" content="PhalApi,phalapi,phalapi接口开发,后台接口开发,后台接口开发框架,接口开发,接口框架,开源接口框架,PHP后台接口开发,PHP接口开发,PHP接口框架,PHP后台接口框架,phalapi官网,PHP接口框架,php接口开发框架,php接口开发,php web框架,π框架,π开发框架,π接口框架,π接口开发框架,api接口,php接口,,PHP接口框架,phalapi文档,phalapi wiki,PhalApi文档,phalapi在线文档,phalapi官方文档">

    <link rel="stylesheet" type="text/css" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" media="screen">
    <link rel="stylesheet" type="text/css" href="https://cdn.bootcss.com/font-awesome/4.7.0/css/font-awesome.css" media="screen">
    <link rel="stylesheet" href="../css/main.css" />
    <link rel="stylesheet" href="../css/loading_bar.css" />
    <link rel="icon" href="http://webtools.qiniudn.com/dog_catch.png" type="image/x-icon" />
    <script src="../js/pace.min.js"></script>
	
	<!-- 代码高亮 -->
	<link rel="stylesheet" href="../css/highlight.min.css">
	<script src="../js/highlight.min.js"></script>
	<script>hljs.initHighlightingOnLoad();</script>
    
</head>

<body>
    <!-- navbar start -->
    <div class="navbar navbar-default navbar-fixed-top" id="mainnav" role="navigation">
        <div class="container">
            <div class="navbar-header">
                <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target=".navbar-collapse">
                    <span class="sr-only">Toggle navigation</span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                </button>
                <a class="navbar-brand website_name" href="/"><!-- <span>PhalApi</span> --><strong>PhalApi</strong></a>
            </div>
            <div class="navbar-collapse collapse" aria-expanded="false" style="height: 1px;">
                <ul class="nav navbar-nav navbar-right" id="nav_bar">
                    <li><a href="/"><span class="glyphicon glyphicon-home"></span></a></li>
                    <li><a href="http://qa.phalapi.net/">社区</a></li>
                    <li><a href="/download.html">下载</a></li>
                    <li class="active"><a href="/wikis/">文档</a></li>
                    <li><a href="http://www.ituring.com.cn/book/2405">书籍</a></li>
                    <li><a href="http://demo.phalapi.net/">体验</a></li>
                    <li><a href="/about.html">关于</a></li>
                    <li><a href="/donate.html">贡献</a></li>
                    <li><a href="/wikis/en/">English</a></li>
                </ul>
            </div>
            <!--/.nav-collapse -->
        </div>
    </div>
    <!-- navbar end -->


    <div id="content">
        <div class="container">
            <div class="row row-md-flex row-md-flex-wrap">
                <h4><a href="/wikis/%5B1.25%5D-%E5%9B%BD%E9%99%85%E5%8C%96%E7%BF%BB%E8%AF%91%EF%BC%9A%E4%B8%BA%E8%B5%B0%E5%90%91%E5%9B%BD%E9%99%85%E5%8C%96%E6%8F%90%E5%89%8D%E5%81%9A%E5%A5%BD%E7%BF%BB%E8%AF%91%E5%87%86%E5%A4%87.html">上一章</a>   <a href="/wikis/">文档首页</a>   <a href="/wikis/%5B1.27%5D-%E7%B2%BE%E7%9B%8A%E5%BC%80%E5%8F%91%EF%BC%9A%E6%9B%B4%E5%AF%8C%E8%A1%A8%E7%8E%B0%E5%8A%9B%E7%9A%84Model%E5%B1%82%E5%92%8C%E9%87%8D%E9%87%8F%E7%BA%A7%E6%95%B0%E6%8D%AE%E8%8E%B7%E5%8F%96%E7%9A%84%E5%BA%94%E5%AF%B9%E6%96%B9%E6%A1%88.html">下一章</a></h4>
<hr />
<h2>1.26.1 对称加密和非对称加密</h2>
<p>关于数据加密和安全这一块，只作简单说明。  </p>
<p>首先，对称加密是指数据可以加密成密文也可以解密还原，共用同一个密钥，而非对称是则公钥和私钥，两者皆使用可逆加密算法。不可逆加密不存在密钥，只有salt，用来增加可变性和随机性，如md5。而在加密里面，又数块算法加密的方式最为完善，随附图一张：</p>
<p><img src="http://webtools.qiniudn.com/20150411005257_f66cbee3d910a092bfee33dd72a2f3cd" alt="05152" /></p>
<h2>1.26.2 PHP的mcrypt加密扩展</h2>
<p>在PhalApi中，同样也是使用了mcrypt作为底层的数据加密技术方案。请查看： <a href="http://php.net/manual/zh/book.mcrypt.php">PHP 手册 函数参考 加密扩展</a>  </p>
<h2>1.26.3 加解密的使用</h2>
<p>在单元测试中，我们可以快速找到加密和解密的使用，这里再简单举一例：</p>
<pre><code class="language-php">$mcrypt = new PhalApi_Crypt_Mcrypt('12345678');

$data = 'The Best Day of My Life';
$key = 'phalapi';

$encryptData = $mcrypt-&gt;encrypt($data, $key);
var_dump($encryptData);

$decryptData = $mcrypt-&gt;decrypt($encryptData, $key);
var_dump($decryptData);</code></pre>
<p>上面将会输出(有乱码)：</p>
<p><img src="http://webtools.qiniudn.com/20150411005257_f8e1f72b08a9520c391295ca428a9ac5" alt="0215" /></p>
<h2>1.26.4 更富弹性和便于存储的加密方案</h2>
<p>上面看到，mcrypt下的加密在两点不足：</p>
<ul>
<li>1、有乱码，不能很好地永久化存储；</li>
<li>2、只针对文本字符串的加密，不支持数组等，且无法还原类型；</li>
</ul>
<p>为此， 我们提供了更富弹性和便于存储的加密方案，即：序列化 + base64 + mcrypt的多重加密方案。  </p>
<p>以下是上面的示例-多重加密版：</p>
<pre><code class="language-php">$mcrypt = new PhalApi_Crypt_MultiMcrypt('12345678');

$data = 'The Best Day of My Life';
$key = 'phalapi';

$encryptData = $mcrypt-&gt;encrypt($data, $key);
var_dump($encryptData);

$decryptData = $mcrypt-&gt;decrypt($encryptData, $key);
var_dump($decryptData);</code></pre>
<p>对应的输出（这里使用了文字结果输出，是因为没了乱码）：</p>
<pre><code class="language-php">string(44) "rmFMdhvszAkHhOdzwt/APBACk/Mn/SqhV1Ahp1xT0Gk="
string(23) "The Best Day of My Life"</code></pre>
<h2>1.26.5 RSA的支持与超长字符串的应对方案</h2>
<p>基于项目有使用RSA进行加密和解密的需求，这里特扩展对RSA的支持。同时针对到RSA对字符串长度的限制，提供了分段处理的方案。RSA加密模块的静态类结构UML如下：<br />
<img src="http://webtools.qiniudn.com/20150411005257_e38fc8af28ac9c382e0e3ef8efbb2b86" alt="rsa-PhalApi" /></p>
<h3>(1)原生态的通信加密和解密</h3>
<p>此部分只是简单地封装了openssl相关函数的操作，可以实现与其他语言和客户端下RSA的加密通信。<br />
唯一需要注意的是，对于 <strong>“私钥加密，公钥解密”</strong> 和 <strong>“公钥加密，私钥解密”</strong> 这两种情况下key的互换和对应问题。不要混淆。  </p>
<h3>(2)超长字符串的分段处理</h3>
<p>这里重点说明一下超长字符串通信加密的问题。<br />
解决方案主要涉及两点：一是分段的处理，二是中间层转换。分段是指将待加密的字符串分割成允许最大长度117（有用户反馈说是127）内的数组，再各自处理；中间层转换是为了稳定性、通用性和方便落地存储，使用了json和base64的结合编码。  </p>
<p>虽然此方案解决了超长字符串的问题，但需要特别指出的是， <strong>不能与其他语言、或者PHP其他框架和客户端进行原生态的RSA通信</strong> 。<br />
我们突破了长度的限制，但失去了通用性。这里罗列一下各个场景和对应的处理方式：</p>
<h4>支持：PhalApi项目A  &lt;--&gt; PhalApi项目A</h4>
<h4>支持：PhalApi项目A  &lt;--&gt; PhalApi项目B，PhalApi项目C，PhalApi项目D，...</h4>
<h4>不支持：PhalApi项目 &lt;--&gt; 非PhalApi项目的PHP项目</h4>
<p>解决方案：将以下RSA模块相关的代码以包的形式拷贝到需要的PHP项目。  </p>
<pre><code class="language-bash">.
├── Crypt
│   └── RSA
│       ├── KeyGenerator.php
│       ├── MultiBase.php
│       ├── MultiPri2Pub.php
│       ├── MultiPub2Pri.php
│       ├── Pri2Pub.php
│       └── Pub2Pri.php
└── Crypt.php
</code></pre>
<h4>不支持：PhalApi项目 &lt;--&gt; 非PHP语言的项目</h4>
<p>解决方案：参考PhalApi对RSA超长字符串的处理，同步实现。  </p>
<h4>不支持：PhalApi项目 &lt;--&gt; 客户端（iOS/Android/Windows Phone, etc）</h4>
<p>解决方案：参考PhalApi对RSA超长字符串的处理，同步实现。  </p>
<h3>(3)使用示例：2块2毛2和故事</h3>
<p>这是一个有趣的故事，发生在我一个很好的朋友身上。   </p>
<p>在去年暑假的时候，有位师妹通过几层关系找到我朋友，想他帮她支付回家的火车票。本着“调试”（调戏）的精神，我朋友爽快地答应了并让她把支付宝帐号发过来。然后，不一会，我朋友收到了一条有支付宝帐号的短信，立马打了2.22元过去，并附言： <strong>别问我是谁，请叫我雷锋！</strong> 后来证实师妹没发来过短信，原来收到的那条是诈骗的短信。。。。你能想象得到骗子收到这2.22元和看到这条留言时的表情么，哈哈~~      </p>
<p>以下测试代码，以上面故事为背景，并演示了RSA的使用示例：</p>
<pre><code class="language-php">    public function testDecryptAfterEncrypt()
    {
        $keyG = new PhalApi_Crypt_RSA_KeyGenerator();
        $privkey = $keyG-&gt;getPriKey();
        $pubkey = $keyG-&gt;getPubKey();

        DI()-&gt;crypt = new PhalApi_Crypt_RSA_MultiPri2Pub();

        $data = 'AHA! I have $2.22 dollars!';

        $encryptData = DI()-&gt;crypt-&gt;encrypt($data, $privkey);

        $decryptData = DI()-&gt;crypt-&gt;decrypt($encryptData, $pubkey);

        $this-&gt;assertEquals($data, $decryptData);
    }</code></pre>
<h2>1.26.6 建议</h2>
<p>在上面的加密中，接口项目在开发时，需要自定义两个值：加密向量和私钥。  </p>
<p>为了提高数据加密的安全度，建议：</p>
<ul>
<li>加密向量项目统一在./Config/app.php中配置；</li>
<li>各模块业务数据加密所用的Key则由各业务点自定义；</li>
</ul>
<p>这样，可以对不同的数据使用不同的加密私钥，即使破解了某一个用户的数据，也难以破解其他用户的。</p>
<h2>1.26.7 扩展你的对称加密</h2>
<p>尤其对于加密方案和算法，我们在项目开发决策时，更应该优先考虑使用现在行业内成熟公认的加密方案和算法，而不是自己去从头研发。  </p>
<p>但如果你项目确实有此需要，或者需要在mcrypt的基础上再作一些变通，也是可以很快地实现和注册使用。  </p>
<p>首先，请先实现下面的加密接口：</p>
<pre><code class="language-php">// $vim ./PhalApi/PhalApi/Crypt.php

interface PhalApi_Crypt {

    public function encrypt($data, $key);

    public function decrypt($data, $key);
}</code></pre>
<p>然后，重新注册加密服务即可。</p>
<hr />
<h4><a href="/wikis/%5B1.25%5D-%E5%9B%BD%E9%99%85%E5%8C%96%E7%BF%BB%E8%AF%91%EF%BC%9A%E4%B8%BA%E8%B5%B0%E5%90%91%E5%9B%BD%E9%99%85%E5%8C%96%E6%8F%90%E5%89%8D%E5%81%9A%E5%A5%BD%E7%BF%BB%E8%AF%91%E5%87%86%E5%A4%87.html">上一章</a>   <a href="/wikis/">文档首页</a>   <a href="/wikis/%5B1.27%5D-%E7%B2%BE%E7%9B%8A%E5%BC%80%E5%8F%91%EF%BC%9A%E6%9B%B4%E5%AF%8C%E8%A1%A8%E7%8E%B0%E5%8A%9B%E7%9A%84Model%E5%B1%82%E5%92%8C%E9%87%8D%E9%87%8F%E7%BA%A7%E6%95%B0%E6%8D%AE%E8%8E%B7%E5%8F%96%E7%9A%84%E5%BA%94%E5%AF%B9%E6%96%B9%E6%A1%88.html">下一章</a></h4><div style="float: left">
<h4>
<a href="http://qa.phalapi.net/">还有疑问？欢迎到社区提问！</a>
</h4>
</div>
            </div>
        </div>
    </div>

 <!-- 广告位 -->
<div class="grid-wrapper desktop-only">
	<p align="center">
		<a href="http://7xiz2f.com1.z0.glb.clouddn.com/%E6%88%91%E7%9A%84%E5%90%8D%E5%AD%97%E5%8F%AB%EF%BC%9A%CF%80%E6%A1%86%E6%9E%B6%20-%20PhalApi%202016%E5%B9%B4%E5%BA%A6%E5%BC%80%E6%BA%90%E6%80%BB%E7%BB%93%20-%20%E5%AE%98%E6%96%B9%E5%87%BA%E5%93%81.pdf" target="blank"><img width="950" height="100" src="http://7xiz2f.com1.z0.glb.clouddn.com/ad_20170104.png"></a>
		<a href="http://www.itran.cc/" target="blank"><img width="950" height="100" src="http://7xslqv.com1.z0.glb.clouddn.com/images/9/69/b88bc92455dc1239f9a5bf8d72929.png"></a>
		<a href="http://web-tools.phalapi.net/" target="blank"><img width="950" height="100" src="http://7xslqv.com1.z0.glb.clouddn.com/images/7/d0/88f523566c482296aecc43d185ca2.png"></a>
	</p>
</div>

        <!-- footer -->
        <div class="footer">
            <div class="link container ">
                <div class=" col-xs-7 col-sm-7 col-md-7 col-lg-7 ">
                    <h3>PhalApi (π框架)</h3>
                    <p>一个轻量级PHP开源接口框架，专注于接口服务开发，支持HTTP/SOAP/RPC协议，拥有自动生成的在线文档、多种开发语言的客户端SDK包以及可重用的扩展类库，可用于快速搭建微服务、RESTful接口或Web
                        Services。</p>
                    <!-- <p>:</p> -->
                    <span>友情链接:</span>
                    <a href="https://www.phalapi.net/" target="_blank"> PhalApi </a>
                    <a href="http://www.oschina.net/" target="_blank"> 开源中国 </a>
                    <a href="https://www.itran.cc/" target="_blank">艾翻译</a>
                    <a href="http://www.phalconphp.com/en/" target="_blank">Phalcon</a>
                    <a href="https://phpunit.de/manual/3.7/zh_cn/automating-tests.html" target="_blank">PHPUnit</a>
                    <a href="http://www.thoughtworks.com/cn/" target="_blank">ThoughtWorks</a>
                    <a href="mailto:chanzonghuang@gmail.com">友链交换</a>

                </div>
                <div class=" col-xs-5 col-sm-5 col-md-5 col-lg-5 contact_us ">
                    <h3>联系我们</h3>
                    <a href="https://github.com/phalapi/phalapi"><img src="../images/github.png" alt="github" /></a>
                    <a href="http://weibo.com/p/100808d236e99beb645bfb56ed1c37dde9b8bd?k=phalapi%E5%BC%80%E6%BA%90%E6%A1%86%E6%9E%B6&from=501&_from_=huati_topic"><img src="../images/weibo.png"  alt="weibo" /></a>
                    <a href="http://7xslqv.com1.z0.glb.clouddn.com/images/1/b0/894fde762850cb11250253f7d5ede.png"><img src="../images/zfb.png"  alt="zfb" /></a>
                    <a href="https://jq.qq.com/?_wv=1027&k=4A6reum"><img src="../images/qq.png"  alt="qq" /></a>
					<a href="http://git.oschina.net/dogstar/PhalApi"><img src="../images/git-oschina.png"  alt="git-oschina" /></a>
                </div>
                <div class="cls"></div>
                <div class="text-center copy_right"> ©2015-2017 PhalApi All Rights Reserved. <a href="http://www.miitbeian.gov.cn" target="_blank">粤ICP备15028808号</a>

				<script type="text/javascript">var cnzz_protocol = (("https:" == document.location.protocol) ? " https://" : " http://");document.write(unescape("%3Cspan id='cnzz_stat_icon_1255326144'%3E%3C/span%3E%3Cscript src='" + cnzz_protocol + "s4.cnzz.com/z_stat.php%3Fid%3D1255326144%26show%3Dpic' type='text/javascript'%3E%3C/script%3E"));</script>
                </div>
            </div>
        </div>
    </div>


    <a href="https://github.com/phalapi"><img id="gitHub_fllow" style="position: fixed; top: 0; right: 0; border: 0;z-index:9999" src="https://camo.githubusercontent.com/652c5b9acfaddf3a9c326fa6bde407b87f7be0f4/68747470733a2f2f73332e616d617a6f6e6177732e636f6d2f6769746875622f726962626f6e732f666f726b6d655f72696768745f6f72616e67655f6666373630302e706e67" alt="Fork me on GitHub" data-canonical-src="https://s3.amazonaws.com/github/ribbons/forkme_right_orange_ff7600.png"></a>


    <script src="../js/jquery-1.11.1.min.js"></script>
    <script src="../js/bootstrap.min.js"></script>
</body>

</html>